#include "websocket_server.hpp"
#include <iostream>

/**
 * @brief WebSocketServer构造函数实现
 * 
 * 初始化服务器，设置监听地址和端口
 * 并开始接受新的连接
 */
WebSocketServer::WebSocketServer(boost::asio::io_context& io_context, 
                               const std::string& address, 
                               unsigned short port,
                               IMessageReceiver& receiver)
    : io_context_(io_context),
      acceptor_(io_context, boost::asio::ip::tcp::endpoint(boost::asio::ip::make_address(address), port)),
      receiver_(receiver) {
}

/**
 * @brief 启动服务器
 * 
 * 记录服务器启动日志
 */
void WebSocketServer::start() {
    Logger::info("WebSocket server started");
    do_accept();  // 开始接受新的连接
}

/**
 * @brief 停止服务器
 * 
 * 关闭接受器，停止接受新的连接
 * 记录服务器停止日志
 */
void WebSocketServer::stop() {
    acceptor_.close();
    Logger::info("WebSocket server stopped");
}

/**
 * @brief 发送消息
 * @param session_id 会话ID
 * @param message 消息
 */
void WebSocketServer::send_message(uint32_t session_id, const nlohmann::json& message) {
    // 找到对应的会话
    auto session = get_session(session_id);
    if (session) {
        session->send(message);
    } else {
        Logger::error("Session not found");
    }
}

/**
 * @brief 获取会话
 * @param session_id 会话ID
 * @return 会话
 */
std::shared_ptr<WebSocketSession> WebSocketServer::get_session(uint32_t session_id) {
    std::lock_guard<std::mutex> lock(mutex_);
    return sessions_[session_id];
}
/**
 * @brief 开始接受新的连接
 * 
 * 异步等待新的TCP连接
 * 当有新连接时，创建WebSocket会话并开始处理
 */
void WebSocketServer::do_accept() {
    acceptor_.async_accept(
        std::bind(&WebSocketServer::on_accept, this,
                  std::placeholders::_1,  // error_code
                  std::placeholders::_2)); // socket
}

/**
 * @brief 处理新连接的回调函数
 * 
 * 当有新连接建立时，创建WebSocket会话并开始处理
 * 然后继续接受新的连接
 */
void WebSocketServer::on_accept(boost::beast::error_code ec, boost::asio::ip::tcp::socket socket) {
    if (!ec) {
        // 创建新的WebSocket会话并开始处理
        std::lock_guard<std::mutex> lock(mutex_);
        auto session = std::make_shared<WebSocketSession>(std::move(socket), receiver_, session_id_counter_);
        sessions_[session_id_counter_] = session;
        session->start();
        session_id_counter_++;

        // 打印日志, session id
        Logger::info("New WebSocket connection established");
    }
    do_accept();  // 继续接受新的连接
} 